/**
 * Author(s): xuming.Wong <xuming.Wong@gmail.com>
 */

#ifndef __NG_PREREQUISTITES_H__
#define __NG_PREREQUISTITES_H__

// Study from OGRE source
// Platform-specific stuff
#include "NgPlatform.h"
#include "NgEnums.h"

//use some ogre class
namespace Ogre
{
	//used as base of our terrain system
	class TerrainGlobalOptions;
	class TerrainGroup;
	class TerrainPaging;
	class PageManager;
	class PagedWorld;

}

namespace PQEngine
{
    // Define GDK3D version
    #define GDK3D_VERSION_MAJOR 0
    #define GDK3D_VERSION_MINOR 1
    #define GDK3D_VERSION_PATCH 1
	#define GDK3D_VERSION_SUFFIX ""
    #define GDK3D_VERSION_NAME "Seeker"

    #define GDK3D_VERSION    ((GDK3D_VERSION_MAJOR << 16) | (GDK3D_VERSION_MINOR << 8) | GDK3D_VERSION_PATCH)

// Pre-declare classes
// Allows use of pointers in header files without including individual .h
// so decreases dependencies between files

	class GPKFile;
	class GPKArchive;
	class GPKArchiveManager;

	class Object;
	class Event;

	class Component;

	class SceneObject;
	

	class GameObject;
	class GameObjectManager;

	class EntityObject;
	class LightObject;

	class TerrainObject;

	class MeshData;

	class Sprite2D;
	class SpriteManager;
	
	class TerrainManager;
	class EnvironmentManager;
	
	//typedefs
	typedef std::vector<std::string> StringVector;
	typedef std::map<std::string,int> StringIntMap;
	typedef std::vector<Object*> ObjectVector;
	typedef std::vector<Component*> ComponentVector;
	typedef std::vector<GameObject*> GameObjectVector;

	inline void ShouldNotReach(std::string msg)
	{
		std::string m=msg;
		assert(!"Should not reach");
		
	}


}

#endif
